package projeto;

import java.net.SocketException;
import java.net.UnknownHostException;

import junit.framework.TestCase;

import projeto.exception.ParserException;
import projeto.exception.RoteadorException;
import projeto.parser.Parser;
import projeto.roteador.Configuration;
import projeto.roteador.Roteador;
import projeto.roteador.RoteadorFactory;
import projeto.roteador.VetorDistancia;

public class RoteadorTest2 extends TestCase {
	private static final String ROTEADOR_CONFIG = "./conf_testes/test2/roteador_test.config";
	private static final String ENLACES_CONFIG = "./conf_testes/test2/enlaces_test.config";
	
	protected Roteador r1;
	protected Roteador r2;
	protected Roteador r3;
	protected Roteador r4;
	
	protected void setUp() throws ParserException, SocketException, RoteadorException {
		Configuration.getInstance().setTimeToSend(1*1000);
		Parser p = new Parser(ROTEADOR_CONFIG, ENLACES_CONFIG);
		r1 = new RoteadorFactory().makeRoteador(1, p);
		r2 = new RoteadorFactory().makeRoteador(2, p);
		r3 = new RoteadorFactory().makeRoteador(3, p);
		r4 = new RoteadorFactory().makeRoteador(4, p);
	}
	
	protected void tearDown() {
		r2.kill();
		r3.kill();
		r4.kill();
	}

	public void test() throws UnknownHostException, SocketException,
			InterruptedException, ParserException, RoteadorException {
		r1.init();
		r2.init();
		r3.init();
		r4.init();
		
		Thread.sleep(5 * 1000); // espera 5 segundos
		testaSucesso();
		r1.kill();
		Thread.sleep(10 * 1000); // espera 10 segundos
		testaFalhaEnlace();
	}

	private boolean testaFalhaEnlace() {
		VetorDistancia v2 = makeVetDist2Falha();
		assertEquals(v2, r2.getVetorDistancia());

		VetorDistancia v3 = makeVetDist3Falha();
		assertEquals(v3, r3.getVetorDistancia());

		VetorDistancia v4 = makeVetDist4Falha();
		assertEquals(v4, r4.getVetorDistancia());
		return true;
	}

	private VetorDistancia makeVetDist4Falha() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, VetorDistancia.INFINITY);
		v.setValor(2, 5);
		v.setValor(3, 2);
		v.setValor(4, 0);
		return v;
	}

	private VetorDistancia makeVetDist3Falha() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, VetorDistancia.INFINITY);
		v.setValor(2, 3);
		v.setValor(3, 0);
		v.setValor(4, 2);
		return v;
	}

	private VetorDistancia makeVetDist2Falha() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, VetorDistancia.INFINITY);
		v.setValor(2, 0);
		v.setValor(3, 3);
		v.setValor(4, 5);
		return v;
	}

	private boolean testaSucesso() {
		VetorDistancia v1 = makeVetDist1Sucesso();
		assertEquals(v1, r1.getVetorDistancia());

		VetorDistancia v2 = makeVetDist2Sucesso();
		assertEquals(v2, r2.getVetorDistancia());

		VetorDistancia v3 = makeVetDist3Sucesso();
		assertEquals(v3, r3.getVetorDistancia());

		VetorDistancia v4 = makeVetDist4Sucesso();
		assertEquals(v4, r4.getVetorDistancia());
		return true;
	}

	private VetorDistancia makeVetDist4Sucesso() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, 8);
		v.setValor(2, 5);
		v.setValor(3, 2);
		v.setValor(4, 0);
		return v;
	}

	private VetorDistancia makeVetDist3Sucesso() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, 6);
		v.setValor(2, 3);
		v.setValor(3, 0);
		v.setValor(4, 2);
		return v;
	}

	private VetorDistancia makeVetDist2Sucesso() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, 3);
		v.setValor(2, 0);
		v.setValor(3, 3);
		v.setValor(4, 5);
		return v;
	}

	private VetorDistancia makeVetDist1Sucesso() {
		VetorDistancia v = new VetorDistancia();
		v.setValor(1, 0);
		v.setValor(2, 3);
		v.setValor(3, 6);
		v.setValor(4, 8);
		return v;
	}

}
